package org.feng.service;

import org.feng.entity.Student;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.List;

/**
 * 学生业务
 *
 * @version v1.0
 * @author: fengjinsong
 * @date: 2022年06月11日 11时10分
 */
public interface StudentService {

    /**
     * 通过学生ID获取学生对象
     *
     * @param id 学生ID
     * @return 学生对象
     */
    Mono<Student> getById(Integer id);

    /**
     * 通过租户Key，在对应的租户数据库中模糊查询 name 对应的学生列表
     *
     * @param merchantKey 租户key
     * @param name        学生名字的一部分
     * @return 符合条件的学生列表
     */
    Flux<Student> getStudentsByName(String merchantKey, String name);

    /**
     * 保存/更新单个学生信息
     *
     * @param student 学生信息
     * @return 插入或更新后的学生信息
     */
    Mono<Student> saveStudent(Student student);

    /**
     * 批量操作：保存/更新学生信息
     *
     * @param studentList 学生列表
     * @return 插入或更新后的学生列表
     */
    Flux<Student> saveStudent(List<Student> studentList);

    /**
     * 根据ID删除学生信息
     *
     * @param id 学生ID
     * @return 无结果
     */
    Mono<Void> deleteStudent(Integer id);

    /**
     * 查询学生信息，指定当前页（从1开始），指定学生名字的一部分。
     *
     * @param currentPage 当前页，从1开始
     * @param subName     名字的一部分，用于模糊查询，使用 sql 的 like 语法
     * @return 符合条件的当页的学生信息
     */
    Flux<Student> selectStudent(Integer currentPage, String subName);

    Flux<Student> selectStudentByExample1(Student student);

    Flux<Student> selectStudentByExample2(Student student);
}
